home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 18
/
CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso
/
CUCD
/
Utilities
/
FinderV3
/
Source
/
FinderV3Main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-07-03
|
14KB
|
548 lines
/* Main-Header File inserted by GenCodeC */
/* Libraries */
#include <libraries/mui.h>
#include <libraries/gadtools.h> /* for BARLABEL in MenuItem */
/* Prototypes */
#include <clib/muimaster_protos.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <clib/asl_protos.h>
/* Pragmas */
#include <pragmas/muimaster_pragmas.h>
#include <pragmas/asl_pragmas.h>
/* Increase stack size */
LONG __stack=8192;
/* GenCodeC header end */
/* Include generated by GenCodeC */
#include "FinderV3GUI.c"
/* Misc Includes */
/* Declarations for libraries (inserted by GenCodeC) */
struct Library * IntuitionBase;
struct Library * MUIMasterBase;
struct Library ASLBase;
/* Global declarations */
BOOL debug = FALSE;
LONG active;
struct ObjApp * App = NULL; /* Object */
char *drawer_str, *pattern_str, search_str[256];
#define MAXFILELEN 256
char *finished = "\033bOperation successful";
char search_banner[256], num_banner[256];
int files_found = 0;
/* Search options */
BOOL *recurse_bool = FALSE, *case_bool = FALSE;
/* ASL declarations */
struct TagItem frtags[] =
{
ASL_Hail, (ULONG)"Choose file to save list to...",
ASL_Height, 400,
ASL_Width, 320,
ASL_LeftEdge, 0,
ASL_TopEdge, 0,
ASL_OKText, (ULONG)"Ok",
ASL_CancelText,(ULONG)"Cancel",
ASL_File, (ULONG)"Finder.list",
ASL_Dir, (ULONG)"RAM:",
TAG_DONE
};
/* Function prototypes */
void GUIFind(void);
BOOL SearchDir(char *directory, char *pattern);
void Save_List(void);
/* Init() function */
void init( void )
{
if (!(IntuitionBase = OpenLibrary("intuition.library",37)))
{
printf("Can't Open Intuition Library\n");
exit(20);
}
if (!(MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)))
{
printf("Can't Open MUIMaster Library\n");
CloseLibrary(IntuitionBase);
exit(20);
}
}
/* GenCodeC init() end */
/* End() function */
void end( void )
{
CloseLibrary(MUIMasterBase);
CloseLibrary(IntuitionBase);
exit(0);
}
/* GenCodeC end() end */
/*
** App message callback hook. Note that the object given here
** is the object that called the hook, i.e. the one that got
** the icon(s) dropped on it.
*/
SAVEDS ASM LONG AppMsgFunc(REG(a2) APTR obj, REG(a1) struct AppMessage **x)
{
struct WBArg *ap;
struct AppMessage *amsg = *x;
int i;
static char buf[256];
char *b = buf;
for ( ap = amsg->am_ArgList, i = 0 ; i < amsg->am_NumArgs ; i++, ap++ )
{
NameFromLock(ap->wa_Lock, buf, sizeof(buf));
AddPart(buf, ap->wa_Name, sizeof(buf));
/* We need to strip away down to the trailing / if this is a file */
do {
if (buf[strlen(buf) - 1] != '/')
{
buf[strlen(buf) - 1] = '\0';
}
} while (buf[strlen(buf) - 1] != '/');
}
set(App->STR_DrawerPopup, MUIA_String_Contents, b);
return(0);
}
/* Main Function inserted by GenCodeC */
int main(int argc, char *argv[])
{
BOOL running = TRUE;
ULONG signal;
static const struct Hook AppMsgHook = { { NULL,NULL },(VOID *)AppMsgFunc,NULL,NULL };
/* Program initialisation : generated by GenCodeC */
init();
/* Create Object : generated by GenCodeC */
if (!(App = CreateApp()))
{
printf("Can't Create App\n");
end();
}
/* App hook stuff */
DoMethod(App->STR_DrawerPopup, MUIM_Notify, MUIA_AppMessage, MUIV_EveryTime,
App->STR_DrawerPopup, 3, MUIM_CallHook, &AppMsgHook, MUIV_TriggerValue);
set(App->App, MUIA_Application_DropObject, App->STR_DrawerPopup);
while (running)
{
switch (DoMethod(App->App, MUIM_Application_Input, &signal))
{
case MUIV_Application_ReturnID_Quit:
get(App->DrawerPopup, MUIA_Popasl_Active, &active);
if (active)
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Please close the ASL File Requester\nbefore exiting");
else
running = FALSE;
break;
/* Insert your code between the "case" statement and comment "end of case ..." */
case FindPressed:
GUIFind();
break;
/* end of case Find */
case SaveList:
Save_List();
break;
/* end of case SaveList */
case PrintList:
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Sorry, this feature has not been implemented yet");
break;
/* end of case PrintList */
/* End computing of IDCMP */
default:
break;
}
if (running && signal) Wait(signal);
}
DisposeApp(App);
end();
}
/*
** void GUIFind()
**
** This function sorts out actually finding (wow!)
**
*/
void GUIFind()
{
char *ptr = search_banner;
char *num_ptr = num_banner;
/* Error buffer */
LONG error_buf;
/* Clear the current list*/
DoMethod(App->FileList, MUIM_List_Clear);
files_found = 0;
/* Put the application to sleep while we find */
set(App->MainWin, MUIA_Window_Sleep, TRUE);
/* Get the contents of the MUI string objects and search options*/
get(App->STR_DrawerPopup, MUIA_String_Contents, &drawer_str);
get(App->PatternStr, MUIA_String_Contents, &pattern_str);
get(App->casecheck, MUIA_Selected, &case_bool);
get(App->recursecheck, MUIA_Selected, &recurse_bool);
if (debug)
{
if (case_bool != FALSE)
printf("Case sensetive\n");
if (recurse_bool)
printf("Recursive\n");
printf("Debug1: Dir: %s, Pattern %s\n", drawer_str, pattern_str);
}
if (strlen(drawer_str) == 0 || strlen(pattern_str) == 0)
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: You \033bmust\033n supply a drawer and a pattern");
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
/* Prepare our search */
if (case_bool)
error_buf = ParsePattern(pattern_str, search_str, MAXFILELEN);
else
error_buf = ParsePatternNoCase(pattern_str, search_str, MAXFILELEN);
if (error_buf == -1)
{
/* The Parse has failed */
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: A serious internal error has occured,\npossibly a buffer overflow");
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
/* Put up a banner saying what we are doing */
sprintf(search_banner, "\033bFiles matching '%s' in '%s'", pattern_str, drawer_str);
/*DoMethod(App->FileList, MUIM_List_Insert, &ptr, 1, MUIV_List_Insert_Bottom);*/
set(App->FileList, MUIA_List_Title, ptr);
/* Call the searcher function */
if (!(SearchDir(drawer_str, search_str)))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Search failed.");
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
/* Put up the file counter */
sprintf(num_banner, "-- %i files found", files_found);
DoMethod(App->FileList, MUIM_List_Insert, &num_ptr, 1, MUIV_List_Insert_Bottom);
/* Search has finished, put up the completion banner */
DoMethod(App->FileList, MUIM_List_Insert, &finished, 1, MUIV_List_Insert_Bottom);
set(App->FileList, MUIA_List_Active, MUIV_List_Active_Bottom);
/* Unbusy the window */
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
/*
** BOOL SearchDir(char *directory, char *pattern)
**
** This is the function which actually accesses the disk to find the files
** and compares their names with the pattern supplied.
**
*/
BOOL SearchDir(char *directory, char *pattern)
{
__aligned struct FileInfoBlock fib;
BPTR lk = NULL;
char full_path[255];
char *fpath = full_path;
/* Lock initial directory and store the FileInfoBlock */
if (!(lk = Lock(directory, ACCESS_READ)))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Unable to lock directory");
if (lk) UnLock(lk);
return FALSE;
}
if (!(Examine(lk, &fib)))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Unable to access FileInfoBlock");
if (lk) UnLock(lk);
return FALSE;
}
/* Scan directory */
while (ExNext(lk, &fib))
{
if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Ctrl-C received, stopping search");
UnLock(lk);
return FALSE;
}
/* Build the full path with our ExNext file */
strcpy(full_path, directory);
AddPart(full_path, fib.fib_FileName, 255);
/* Identify this file (is it a directory?) */
if (fib.fib_DirEntryType > 0)
{
/* We have a directory, recursively scan it (if we want to) */
if (recurse_bool)
{
if (!(SearchDir(full_path, pattern)))
{
UnLock(lk);
return FALSE;
}
}
}
else
{
/* We have a file, match it with our pattern */
if (!case_bool)
{
if (MatchPatternNoCase(pattern, fib.fib_FileName))
{
if (debug) printf("We have a match on file '%s'\n", fib.fib_FileName);
DoMethod(App->FileList, MUIM_List_Insert, &fpath, 1, MUIV_List_Insert_Bottom);
set(App->FileList, MUIA_List_Active, MUIV_List_Active_Bottom);
files_found++;
}
}
if (case_bool)
{
if (MatchPattern(pattern, fib.fib_FileName))
{
if (debug) printf("We have a match on file '%s'\n", fib.fib_FileName);
DoMethod(App->FileList, MUIM_List_Insert, &fpath, 1, MUIV_List_Insert_Bottom);
set(App->FileList, MUIA_List_Active, MUIV_List_Active_Bottom);
files_found++;
}
}
}
}
UnLock(lk);
return TRUE;
}
/*
** void Save_List(void)
**
** This function will save the list to a file specified by the user
**
*/
void Save_List( void )
{
/* Variable definitions for the list saving loop */
int i;
FILE *fp = NULL;
LONG result;
char fr_drawer[256];
struct FileRequester *fr;
/* Make sure we actually have a list to save */
if (!drawer_str)
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: There is no list to save");
return;
}
/* Let the user choose a file */
if (!(fr = (struct FileRequester *)MUI_AllocAslRequest(ASL_FileRequest, frtags)))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Unable to allocate the ASL requester");
if (fr) MUI_FreeAslRequest(fr);
return;
}
if (!(MUI_AslRequest(fr, NULL)))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: User cancelled\n\033cList saving aborted");
if (fr) MUI_FreeAslRequest(fr);
return;
}
/* Copy the tags to a AddPart type storage thingy */
strcpy(fr_drawer, fr->rf_Dir);
AddPart(fr_drawer, fr->rf_File, 255);
MUI_FreeAslRequest(fr);
/* Kludge zone!! (almost) */
/* We need to know if the file exists so we know whether or not to pop up an append/overwrite requester */
/* This is done by trying to open the file we want with read flags */
/* If the file exists, this will fill the FILE pointer */
/* we can test for this. If the pointer is not NULL, the file exists and we pop up our requester */
/* Simple! */
if (!(fp = fopen("RAM:Finder.list", "r")))
{
/* The open has failed, therefore, the file doesn't exist and we can just get on and write to it */
/* Now open the file new for writing */
if (fp) fclose(fp); /* Close the FILE pointer, just in case */
if (!(fp = fopen("RAM:Finder.list", "w")))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Unable to open the file");
if (fp) fclose(fp);
return;
}
/* Loop to read the list contents into the file */
/* First, put the window to sleep */
set(App->MainWin, MUIA_Window_Sleep, TRUE);
fprintf(fp, "Search results for drawer '%s' with pattern '%s'\n", drawer_str, pattern_str);
for ( i = 0 ;; i++ )
{
char *name;
DoMethod(App->FileList, MUIM_List_GetEntry, i , &name);
if (!name)
break;
fprintf(fp, "%s\n", name);
}
fclose(fp);
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
else
{
fclose(fp);
/* The file exists, we now need to decide if we want to overwrite, or append it */
/* Append/Overwrite requester - return values: 2 1 0 */
result = MUI_Request(App->App, App->MainWin, 0, NULL, "_Append|_Overwrite|_Cancel", "The file already exists, please choose an operation");
if (result == 2)
{
/* The user wants to overwrite the file */
/* Open the file for overwriting */
if (!(fp = fopen("RAM:Finder.list", "w")))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Unable to open the file");
if (fp) fclose(fp);
return;
}
/* List loop */
set(App->MainWin, MUIA_Window_Sleep, TRUE);
fprintf(fp, "Search results for drawer '%s' with pattern '%s'\n", drawer_str, pattern_str);
for ( i = 0 ;; i++ )
{
char *name;
DoMethod(App->FileList, MUIM_List_GetEntry, i , &name);
if (!name)
break;
fprintf(fp, "%s\n", name);
}
fclose(fp);
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
if (result == 1)
{
/* The user wants to append the file */
/* Open the file for appending */
if (!(fp = fopen("RAM:Finder.list", "a")))
{
MUI_Request(App->App, App->MainWin, 0, NULL,"Ok","Error: Unable to open the file");
if (fp) fclose(fp);
return;
}
/* List loop */
set(App->MainWin, MUIA_Window_Sleep, TRUE);
fprintf(fp, "\nSearch results for drawer '%s' with pattern '%s'\n", drawer_str, pattern_str);
for ( i = 0 ;; i++ )
{
char *name;
DoMethod(App->FileList, MUIM_List_GetEntry, i , &name);
if (!name)
break;
fprintf(fp, "%s\n", name);
}
fclose(fp);
set(App->MainWin, MUIA_Window_Sleep, FALSE);
return;
}
}
return;
}